package com.UnionPayCenter.service;

import com.UnionPayCenter.account.entity.ChargeBill;
import com.UnionPayCenter.account.entity.FundsBill;
import com.UnionPayCenter.account.enums.PayStatusEnum;
import com.UnionPayCenter.entity.dto.FundsPayDTO;
import com.UnionPayCenter.entity.dto.FundsQueryRequest;
import com.UnionPayCenter.entity.dto.TransferCouponsRequest;
import com.UnionPayCenter.entity.vo.CardInfoVo;
import com.UnionPayCenter.entity.vo.FundsBillRecordVo;
import com.UnionPayCenter.entity.vo.PageInfoExtender;
import com.UnionPayCenter.entity.vo.UserCouponVo;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;

import java.util.List;
import java.util.Map;

/**
 * @author Noah
 * @since 1.0.0, 2019/05/19
 */
public interface FundsAccountService {

    /**
     * 向某个用户ID进行充值
     *
     * @param userId
     * @param amount
     */
    JSONObject depositFundsAccount(String shopId, String userId, int amount, String openId);

    /**
     * 向某个用户ID进行充值
     *
     * @param userId
     * @param amount
     */
    JSONObject wechatDepositFundsAccount(String shopId, String userId, int amount, String openId);

    /**
     * 向某个用户ID进行充值
     *
     * @param userId
     */
    void depositBackFundsAccount(String shopId, String userId, String sn, String state);


    /**
     * 余额支付
     *
     * @param payDTO 支付信息
     */
    void balancePay(FundsPayDTO payDTO);


    /**
     * 微信支付回调处理服务类
     */
    Integer wechatPayBack(String serialNumber, PayStatusEnum payStatusEnum);


    /**
     * 微信支付 ,校验正确性  返回流水号
     *
     * @param payDTO
     * @return
     */
    JSONObject wechatPay(FundsPayDTO payDTO);


    /**
     * 微信支付 ,校验正确性  返回流水号
     *
     * @param payDTO
     * @return
     */
    JSONObject unionPay(FundsPayDTO payDTO);


    /**
     * 用户支付
     *
     * @param payDTO       支付信息
     * @param userId       用户
     * @param reduceAmount 优惠金额
     */
    void depositPayFundsAccount(FundsPayDTO payDTO, String userId, Integer reduceAmount);


    /**
     * 根据用户Id查询资金流水
     *
     * @param userId 用户Id
     * @return 充值记录
     */
    PageInfo<FundsBillRecordVo> listAllBillByUserId(String userId, String shopId, Integer page, Integer pageSize, String type,
                                                    FundsQueryRequest request);


    /**
     * 根据用户Id查询充值流水
     *
     * @param request  其他请求参数
     * @return
     */
    PageInfoExtender<FundsBillRecordVo> listDepositByUserId(FundsQueryRequest request);


    /**
     * 根据用户Id查询充值流水
     *
     * @param userId   用户ID
     * @param shopId   店铺ID
     * @param page     分页数
     * @param pageSize 分页大小
     * @param type     类型
     * @param request  其他请求参数
     * @return
     */
    PageInfo<FundsBillRecordVo> listDepositByUserIdFront(String userId, String shopId, Integer page, Integer pageSize, String type,
                                                    FundsQueryRequest request);


    /**
     * 获取用户所有的流水记录
     *
     * @param userId  用户ID
     * @param shopId  店铺ID
     * @param type    充值/消费类型
     * @param request 其他请求参数
     * @return
     */
    List<FundsBill> listBillByUserId(String userId, String shopId, String type, FundsQueryRequest request);


    /**
     * 根据用户Id查询优惠券信息
     *
     * @param jsonParam 查询条件
     * @return 充值记录
     */
    PageInfo<Map<String, Object>> listAllVoucherByUserId(JSONObject jsonParam);

    /**
     * 根据用户Id查询优惠券信息
     *
     * @param cardId 卡号
     * @param userId 用户ID
     * @return 会员卡信息
     */
    CardInfoVo getCardInfoByUserId(String userId, String cardId);

    /**
     * 转增优惠券
     *
     * @param transferCouponsRequest 转增优惠券请求
     */
    void transferCoupons(TransferCouponsRequest transferCouponsRequest);

    /**
     * 转增优惠券
     *
     * @param transferCouponsRequest 转增优惠券请求
     */
    void transferCoupons2(TransferCouponsRequest transferCouponsRequest);


    /**
     * 根据userId获取指定优惠券信息
     *
     * @param userId
     * @param disId
     * @return
     */
    UserCouponVo getUserCouponByDisId(Integer userId, String disId);


    /**
     * 获取资金账户信息
     *
     * @param userId
     * @param shopId
     * @return
     */
    //FundsAccountVo getFundsAccountByUserId(String userId, String shopId);

    /**
     * 根据userId获取指定优惠券信息
     * *
     *
     * @param userId
     * @param thirdId
     * @return
     */
    ChargeBill getByThirdId(String userId, String thirdId);

    /**
     * 根据userId和id获取交易信息
     * *
     *
     * @param userId
     * @param sn
     * @return
     */
    ChargeBill getBySn(String userId, String sn);
}
